/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package aeduserver;

/**
 *
 * @author Adrian Hostettler
 */
/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
import aeducommon.GameModel;
import java.io.*;
import java.net.Socket;
import java.util.Observable;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Adrian Hostettler
 */
class GameServerConn extends Observable
        implements Runnable {

    /**
     * Model, Original serverseitig.
     */
    private GameModel gameModel;
    /**
     * Socket fuer Clientverbindung
     */
    private Socket s;
    /**
     * Eingabestrom vom Client
     */
    private ObjectInputStream inFromClient;
    /**
     * Ausgabestrom zum Client
     */
    private ObjectOutputStream outToClient;

    /**
     * Konstruktor, baut Ueberwachungsmechanismus und Datenstroeme zum/vom
     * Client auf.
     *
     * @param s Socket fuer Clientverbindung
     * @param m Modell auf dem Server
     */
    public GameServerConn(Socket s, GameModel m) {
// Socket
        this.s = s;
        try {
// Datenstroeme
            inFromClient = new ObjectInputStream(s.getInputStream());
            outToClient = new ObjectOutputStream(s.getOutputStream());
            this.run();
        } catch (Exception e) {
            System.out.println("\nConnection für GameModel Austausch konnte nicht gestartet werden.\n  " + e);
        }
    }

    /**
     * Interaktion, liest und verarbeitet Nachrichten vom Client.
     */
    public void run() {
        System.out.println("Protokoll fuer Client gestartet");
        try {
            do {
                gameModel = (GameModel) inFromClient.readObject();
                setChanged();
                notifyObservers(gameModel);
            } while (true);
        } catch (Exception e) {
            System.out.println("\nVerbindung zum Client unterbrochen\n  " + e);
            release();
        }
    }

    public void sendGameModel(Object gm) {
        try {
            outToClient.writeObject(gm);
        } catch (IOException ex) {
            Logger.getLogger(GameServerConn.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /**
     * Schliesst Verbindung zum Client, setzt Model zurueck.
     */
    private void release() {
        System.out.println("Protokoll fuer Client beendet");
        try {
            s.close();
        } catch (Exception e) {
            System.out.println("\nFehler beim Schliessen des Clientprotokoll\n " + e);
        }
    }
}